						% GENERALIZACION DE LA RED NEURONAL
%----------------------------------------------------------------------------------------------
% PARAMETROS DE LA RED
%-----------------------------------------------------------------------------------------------
%  hideLayerNeuronalNum = 10; 			% number of simple perceptron at the first hide layer
%  eta = 0.2; 								% eta is the given value for the tranformation function
%  activation_func = 1;					% Si esta en 1 cargo las se�ales normalizadas para la funcion
%  										% exponencial, sino cargo las de la tangente hiperbolica
%  windowSize = 6;							% size of the window to analize, this will be the size of the input
%  beta = 1;
umbral = 0.3;							% umbral que consideramos para determinar si una salida es correcta o no
contador = 1;							% indice de comienzo de ventana
outputs = [];
wishedOutputs = [];
unosvec = [];
wishedvec = [];
cerosVec = [];
cantCeros = 0;
cantUnos = 0;
Cant_Ceros_Correctos = 0;
Cant_Unos_Correctos = 0;
cantSuccess = 0;						% cantidad de ventanas que dieron un output que es correcto de acuerdo al umbral

%---------------------------------------------------------------------------------------------------
% CARGA DE VECTORES DE SE�ALES
%---------------------------------------------------------------------------------------------------
 if( activation_func == 1 )
	 load generalizationExpSignals.mat;
	 signalsVec = generalizationExpSignals;
 else
	 load generalizationTanSignals.mat;
	 signalsVec = generalizationTanSignals;
 endif
 numPatterns = rows( signalsVec );
%---------------------------------------------------------------------------------------------------
% CARGA DE LAS MATRICES DE LA RED NEURONAL YA ENTRENADA
%---------------------------------------------------------------------------------------------------
load w_final.mat;
load W_final.mat;
%---------------------------------------------------------------------------------------------------
% ALGORITMO DE GENERALIZACION
%---------------------------------------------------------------------------------------------------
for i = 1:numPatterns
		windowVec = getWindow( contador, signalsVec , windowSize);

		if( length( windowVec ) == 0 )
			break;
		endif

		window = getWindowValues( windowVec, windowSize );
		window = [window, -1];

		h_j = w_kj_with_threshold * window';

		h_j = h_j';

		v_j = zeros(1, hideLayerNeuronalNum+1);
		v_j = [g( h_j, beta, activation_func), -1];

		h_i = W_ji_with_threshold * v_j';
		output = g(h_i, beta, activation_func);
		wishedOutput =  getWishedOutput( windowVec, windowSize );
		%Error entre la salida deseada y la salida
		diferencia = abs( wishedOutput - output );

		if( wishedOutput == 1 )
			if( diferencia < umbral )
		      Cant_Unos_Correctos = Cant_Unos_Correctos + 1;
		    endif
			cantUnos = cantUnos + 1;
		    unosvec = [unosvec, diferencia ];
		 else
			cantCeros = cantCeros + 1;
			if( diferencia < umbral )
		         Cant_Ceros_Correctos = Cant_Ceros_Correctos + 1;
			endif
			cerosVec =  [cerosVec, output ];
		endif

		if( diferencia < umbral )
			cantSuccess = cantSuccess + 1;
		endif

		outputs = [outputs , output ];
		wishedOutputs = [ wishedOutputs, wishedOutput ];

		contador = contador + 1;

endfor
%--------------------------------------------------------------------------------------
% GRAFICOS ( diferencia entre la salida esperada y la salida obtenida en funcion solo de los
% patrones cuya salida es 1 )
%--------------------------------------------------------------------------------------
clf;
x = 1:columns(unosvec);
plot( x, unosvec, "*" );
xlabel("cantidad de patrones con salida en 1");
ylabel("error de la salida");
axis([1, length(unosvec) , 0, 0.5]);
hold on
umbralVec = []
for i=1:length(unosvec)
	umbralVec = [umbralVec, umbral ];
endfor
plot( 1:length(umbralVec), umbralVec );
hold off;
print("grafico_generalizacion.png");
%--------------------------------------------------------------------------------------
% ESTADISTICAS
%--------------------------------------------------------------------------------------

printf("\n------------------------------\nRESULTADOS generalizacion\n");
porcentaje_de_Unos_Correctos = Cant_Unos_Correctos * 100 / cantUnos
porcentake_de_Ceros_Correctos = Cant_Ceros_Correctos * 100 / cantCeros
porcentaje_de_correctos = cantSuccess * 100 /length( outputs )
%--------------------------------------------------------------------------------------
